\subsection{Ejercicio 5}

En este ejercicio se pide agregar rutinas para interrupciones específicas: la del clock, la del teclado, la 88 y la 89.\\
La interrupción del clock se mostrará en pantalla en la forma de un cursor girando, y la función que la implementa es proximo\_reloj. Esta función es llamada desde la rutina isr\_reloj, que más adelante también controlará el cambio de tareas.


La interrupcion del teclado responde a los numeros del teclado, mostrandolos en pantalla. Se imprime el numero presionado y al soltarlo se limpia esa porcion de la pantalla. Adicionalmente se creo el mismo soporte para los numeros del teclado numerico.

Las interrupciones 88 y 89 las usarán las tareas provistas por la cátedra, en este punto sólo hacemos que devuelva un cero en \code{eax}, más adelante se cambiarán los privilegios sobre estas interrupciones, la 88 permitirá a las tareas escribir en pantalla y la 89 permitirá obtener páginas de memoria libres.\\

Para implementar las dos primeras interrupciones seguimos el esquema general de una rutina de atención. Ya que eran interrupciones por hardware, era:\\

1) Deshabilitar las interrupciones\\
\code{cli}\\
2) Preservar los registros\\
\code{pushad}\\
3) Comunicar a la PIC que ya se atendió la interrupción. Se usa llama a la rutina fin\_intr\_pic1 (definida en pic.c) \\
\code{call fin\_intr\_pic1}\\
4) Realizar las tareas que correspondan a la interrupción\\
5) Restaurar los registros\\
\code{popad}\\
6) Habilitar las interrupciones\\
\code{sti}\\
7) Retornar de la interrupción\\
\code{iret}\\

ISR DEL RELOJ
En el caso de la interrupción del reloj, sólo tuvimos que llamar a la función proximo\_reloj\\
\\

ISR DEL TECLADO
Pero la rutina de atención del teclado fue más compleja.\\
Pero básicamente, consistió en 6 etapas:\\
\\
1) Leer el \code{scan-code} desde el buffer del teclado, con una instrucción de lectura de puertos (in):\\
in al, 0x60\\

2) Comprobar si se trataba de una tecla que fue presionada (\code{make code}) o de una que fue soltada (\code{break code})\\
El break code de una tecla, es igual a su make code más 0x80. Y habiendo sólo 1byte para codificar scan codes, la única diferencia entre un make code y un break code debía estar en el bit más significativo. De allí que evaluemos dicho bit con: \\
test al, 0x80

3) Si se soltó una tecla, saltar a la rutina de borrado de la letra en pantalla

4) Si se pulsó una tecla, continuar con la rutina de impresión del caracter en pantalla.\\
Los números pertenecientes al teclado alfabético tienen los siguientes scan-codes:\\
Número Scan-Code\\
1          2\\
2          3\\
3          4\\
4          5\\
5          6\\
6          7\\
7          8\\
8          9\\
9          10\\
0          11\\
\\
Los números pertenecientes al teclado alfabético tienen los siguientes scan-codes:\\
Número Scan-Code\\
7          71\\
8          72\\
9          73\\
El 74 corresponde al signo -\\
4          75\\
5          76\\
6          77\\
El 78 corresponde al signo +\\
1          79\\
2          80\\
3          81\\
0          82\\
\\
Sólo realizamos comparaciones, descartando teclas que no correspondiesen a números, y saltando a la etiqueta acorde a la posición de la tecla en el teclado, desde allí a una rutina común, para imprimir el caracter numérico, obtenido de una cadena definida en tiempo de compilación: array\_noNUMPAD y array\_NUMPAD\\

Nota1: fue necesario preservar el EFLAGS porque se usaban instrucciones que lo modificaban (cmp, test, add, ...), que eran necesarias para evaluar a dónde saltar.\\
Nota2: definimos en un espacio de memoria, dos cadenas de caracteres, con los caracteres numéricos ordenados en forma creciente por su scan-code, según pertenezcan al teclado numérico ó no.\\
Nos facilitó mucho el trabajo, porque sólo tuvimos que hacer algunas operaciones con el scan-code para utilizarlo como offset dentro de cada cadena.\\
Ejemplo:\\
teclado alfabético:  restar 1 al scancode\\
teclado numérico: restar 71 al scancode\\
\\


Finalmente, se remapeó la PIC. \\
Con tal fin, se utilizaron las funciones provistas por la cátedra referentes al manejo de la \code{PIC} en los archivos \code{pic.c} y \code{pic.h}: habilitar\_pic, deshabilitar\_pic, resetear\_pic.
